import { getCookie, setCookie } from './lib/cookie'
import { recordMark, searchMarks, changeLang, changeStatus, documentChange } from './views/element'
import crc32 from './lib/crc32'
import getData from './data/get'

/**
 * 多语言包构造器 (Language Pack Constructor)
 * @param {object} options 配置
 * @returns {function} 调用方法
 * 
 *******************************************
 * @description options 配置说明：
 * @property {array} list 语言选择列表，数据结构 [{ name: '中文', code: 'zh' }]
 * @property {string} code 默认语言（list第一个）
 * @property {boolean} status 运行状态（false）
 * @property {boolean} autoKey 自动生成语言key，采用 crc32 算法生成 （false）
 * @property {string} mark 检索标记（'<$$$-LanguagePacker-$$$>'）
 * @property {string} title 弹框标题（翻译）
 * @property {string} cancelBtnName 弹框取消按钮名称（取消）
 * @property {string} confirmBtnName 弹框确定按钮名称（确定）
 * @property {number} zIndex 弹框、翻译按钮层级（默认666666）
 */
export default function factory(options = {}) {
    // 配置
    options = {
        list: [],
        code: '',
        status: true,
        autoKey: false,
        mark: '<$$$-LanguagePacker-$$$>',
        title: '翻译',
        cancelBtnName: '取消',
        confirmBtnName: '确定',
        zIndex: 666666,
        ...options
    }

    // 设置初始语言list[0].code
    if (options.code == '' && options.list[0]) options.code = options.list[0].code

    // 监听文档变化
    documentChange(options)

    // 标记、反查询、转义（返回标记结果）
    const handler = function (val, key) {
        let _value = val
        let _key = val

        // 优先使用执行传入key
        if (key) _key = key
        // 自动生成key
        else if (options.autoKey) _key = crc32(val)
        // 取出原有值
        if (options.code) {
            const _v = getData(options.code, _key)
            if (_v) _value = _v
        }

        // 不翻译
        if (options.status == false) {
            return _value
        }

        // 翻译
        else {
            // 拼接标记
            const str = _value + options.mark

            // 记录标记
            recordMark(str, _key, _value, val)

            // 返回标记结果
            return str
        }
    }

    // options配置
    handler.options = options

    // 设置状态
    handler.setStatus = function (val) {
        options.status = val
        changeStatus(options.status)
    }

    // 设置语言
    handler.setCode = function (val) {
        options.code = val
        changeLang(options)
    }

    // 返回操作器
    return handler
}
